//package com.cph.es.service;
//
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//
//import org.apache.commons.lang.StringUtils;
//import org.elasticsearch.action.search.SearchRequest;
//import org.elasticsearch.action.search.SearchResponse;
//import org.elasticsearch.action.search.SearchType;
//import org.elasticsearch.client.HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory;
//import org.elasticsearch.client.RequestOptions;
//import org.elasticsearch.client.RequestOptions.Builder;
//import org.elasticsearch.client.RestHighLevelClient;
//import org.elasticsearch.index.query.BoolQueryBuilder;
//import org.elasticsearch.index.query.QueryBuilders;
//import org.elasticsearch.index.query.RangeQueryBuilder;
//import org.elasticsearch.search.SearchHit;
//import org.elasticsearch.search.SearchHits;
//import org.elasticsearch.search.builder.SearchSourceBuilder;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import com.myboot.common.elasticsearch.ElasticSearchPoolUtil;
//import com.myboot.m2vds.service.elasticsearch.operator.ESOperator;
//import com.myboot.m2vds.service.elasticsearch.operator.ESServiceImpl;
//import com.myboot.utils.JsonUtil;
//
//public class ESQueryWay extends ESServiceImpl {
//
//	/**
//	 * 索引名称,一张表一个index
//	 */
//	private String indexName = null;
//
//	/**
//	 * 类型名称,基本默认为default
//	 */
//	private String indexType = null;
//	/**
//	 * es客户端
//	 */
//	private RestHighLevelClient client = null;
//	private SearchSourceBuilder sourceBuilder = null;
//	private static Logger logger = LoggerFactory.getLogger(ESQueryWay.class);
//
////    @Autowired
//	private ElasticSearchPoolUtil elasticSearchPoolUtil = new ElasticSearchPoolUtil();
//
//	/**
//	 * 根据条件查询es数据,获取查询结果总数
//	 *
//	 * @param database   es索引名
//	 * @param tablename  es类型名
//	 * @param conditions 查询条件
//	 * @return 返回总数据量
//	 */
//	public long getDataTotalByConditions(List<String> databases, String tablename, List<String> routes, String rangeKey,
//			Map<String, String> conditions) {
//		long totalSize = 0;
//		try {
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			if (client == null) {
//				logger.info("client is  not found!");
//				return 0;
//			}
//			List<String> indices = new ArrayList<String>();
//			for (String index : databases) {
//				validationEsQuery(index, tablename);
//				if (!ESOperator.indicesExists(client, index.toLowerCase())) {
//					// 缺少参数代码
//					log.info("索引："+index + " 不存在");
//					continue;
//				}else {
//					indices.add(index);
//				}
//			}
//			if (indices.isEmpty() || indices.size() == 0) {
//				return 0;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加查询条件
//			String FisrtDay = conditions.get("startTime");
//			String LastDay = conditions.get("endTime");
//			// 添加日期大小范围条件
//			RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//			// 从查询条件去除时间范围
//			conditions.remove("startTime");
//			conditions.remove("endTime");
//
//			// 设置分页
//			sourceBuilder.from(0);
//			// 添加查询条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			boolQueryBuilder.filter(rangeQueryBuilder);
//			if (conditions != null && conditions.size() > 0) {
//				for (Map.Entry<String, String> entry : conditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//				}
//			} else {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
////			if (routes != null && routes.size() > 0) {
////				rq.routing(routes.toArray(new String[routes.size()]));
////			}
//			rq.indices(indices.toArray(new String[indices.size()])).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			// 执行查询
//			SearchResponse response = client.search(rq);
//			totalSize = response.getHits().getTotalHits();
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//		return totalSize;
//	}
//
//	/**
//	 * 根据条件查询es数据,获取查询结果总数
//	 *
//	 * @param database           es索引名
//	 * @param tablename          es类型名
//	 * @param rangeKey           时间区间查询字段
//	 * @param mustConditions     查询条件
//	 * @param shouldConditions   查询条件
//	 * @param wildcardConditions 查询条件
//	 * @return 返回总数据量
//	 */
//	@SuppressWarnings("unused")
//	public long getDataTotalByMustAndShould(List<String> indexs, String tablename, List<String> routes, String rangeKey,
//			Map<String, String> mustConditions, Map<String, List<String>> shouldConditions,
//			Map<String, String> wildcardConditions) {
//		long totalSize = 0;
//		try {
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			if (client == null) {
//				logger.info("client is  not found!");
//				return 0;
//			}
//			List<String> indices = new ArrayList<String>();
//			for (String index : indexs) {
//				validationEsQuery(index, tablename);
//				if (!ESOperator.indicesExists(client, index.toLowerCase())) {
//					// 缺少参数代码
//					log.info("索引："+index + " 不存在");
//					continue;
//				}else {
//					indices.add(index);
//				}
//			}
//			if (indices.isEmpty() || indices.size() == 0) {
//				return 0;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加分页条件
////            sourceBuilder.from((currentPage - 1) * pageSize).size(pageSize);
//			// 添加查询条件
//			String FisrtDay = mustConditions.get("startTime");
//			String LastDay = mustConditions.get("endTime");
//			// 添加日期大小范围条件
//			RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//			// 从查询条件去除时间范围
//			mustConditions.remove("startTime");
//			mustConditions.remove("endTime");
//			// and关系条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (StringUtils.isNotEmpty(mustConditions.get("startSettleDt"))
//					&& StringUtils.isNotEmpty(mustConditions.get("endSettleDt"))) {
//				RangeQueryBuilder rangeQueryBuilder1 = QueryBuilders.rangeQuery("settle_dt")
//						.from(mustConditions.get("startSettleDt")).to(mustConditions.get("endSettleDt"));
//				boolQueryBuilder.filter(rangeQueryBuilder).must(rangeQueryBuilder1);
//				mustConditions.remove("startSettleDt");
//				mustConditions.remove("endSettleDt");
//			} else {
//				boolQueryBuilder.filter(rangeQueryBuilder);
//			}
//			if (mustConditions != null && mustConditions.size() > 0) {
//				for (Map.Entry<String, String> entry : mustConditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//				}
//			}
//			// or关系条件
//			if (shouldConditions != null) {
//				Set<String> keySet = shouldConditions.keySet();
//				for (String key : keySet) {
//					boolQueryBuilder.must(QueryBuilders.termsQuery(key, shouldConditions.get(key)));
//				}
//			}
//			// 模糊查询
//			if (wildcardConditions != null) {
////                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//				for (Map.Entry<String, String> entry : wildcardConditions.entrySet()) {
//					boolQueryBuilder.must(QueryBuilders.wildcardQuery(entry.getKey(), "*" + entry.getValue() + "*"));
//				}
//			}
//			// 没有查询条件
//			if (shouldConditions == null && (mustConditions == null || mustConditions.size() == 0)
//					&& wildcardConditions == null) {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//			// 添加多级排序
////            if (dataPage.getSort() != null) {
////                sourceBuilder.sort(dataPage.getSort(),SortOrder.valueOf(dataPage.getSort()));
//////                searchRequestBuilder.addSort(dataPage.getSort(), SortOrder.valueOf(dataPage.getSort()));
////            }
//			// 执行查询
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
////			if (routes != null && routes.size() > 0) {
////				rq.routing(routes.toArray(new String[routes.size()]));
////			}
//			rq.indices(indices.toArray(new String[indices.size()])).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			SearchResponse response = client.search(rq);
//			totalSize = response.getHits().getTotalHits();
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//		return totalSize;
//	}
//
//	/**
//	 * 根据条件查询es数据,无分页
//	 *
//	 * @param database   es索引名
//	 * @param tablename  es类型名
//	 * @param conditions 查询条件
//	 * @param clazz      输出对象包装类
//	 * @return
//	 */
//	public <T> List<T> getDataByConditions(String database, String tablename, Map<String, String> conditions,
//			Class<T> clazz) {
//		List<T> listBigData2 = new ArrayList<T>();
//		T bb = null;
//		try {
//			validationEsQuery(database, tablename);
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			if (client == null) {
//				logger.info("client is  not found!");
//				return null;
//			}
//			indexName = database.toLowerCase();
//			indexType = tablename.toLowerCase();
//			List<String> esRecords = new ArrayList<String>();
//			if (!ESOperator.indicesExists(client, indexName)) {
//				// 缺少参数代码
//				logger.info("缺少参数代码");
//				return null;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 设置分页
//			sourceBuilder.from(0);
//			// 添加查询条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (conditions != null) {
//				for (Map.Entry<String, String> entry : conditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//				}
//			} else {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
//			rq.indices(indexName).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			// 执行查询
//			SearchResponse response = client.search(rq);
//			SearchHits hits = response.getHits();
//			for (SearchHit hit : hits) {
//				esRecords.add(hit.getSourceAsString());
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//		return listBigData2;
//	}
//
//	/**
//	 * 根据条件和分页查询es数据
//	 *
//	 * @param database   es索引名
//	 * @param tablename  es类型名
//	 * @param conditions 查询条件
//	 * @param clazz      输出对象包装类
//	 * @return 返回查询数据List集合
//	 */
//	public <T> List<T> getPageDataByConditions(List<String> indexs, String tablename, List<String> routes, String rangeKey,
//			Map<String, String> conditions, Integer currentPage, Integer pageSize, Class<T> clazz) {
//		List<T> listBigData2 = new ArrayList<T>();
//		T bb = null;
//		try {
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			if (client == null) {
//				logger.info("client is  not found!");
//				return null;
//			}
//			//查询的数据集
//			List<String> esRecords = new ArrayList<String>();
//			//索引集合
//			List<String> indices = new ArrayList<String>();
//			for (String index : indexs) {
//				validationEsQuery(index, tablename);
//				if (!ESOperator.indicesExists(client, index.toLowerCase())) {
//					// 缺少参数代码
//					log.info("索引："+index + " 不存在");
//					continue;
//				}else {
//					indices.add(index);
//				}
//			}
//			if (indices.isEmpty() || indices.size() == 0) {
//				return listBigData2;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 设置分页
//			sourceBuilder.from((currentPage - 1) * pageSize).size(pageSize);
//			// 添加查询条件
//			String FisrtDay = conditions.get("startTime");
//			String LastDay = conditions.get("endTime");
//			// 添加日期大小范围条件
//			RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//			// 从查询条件去除时间范围
//			conditions.remove("startTime");
//			conditions.remove("endTime");
//			// 添加查询条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			boolQueryBuilder.filter(rangeQueryBuilder);
//			if (conditions != null && conditions.size() > 0) {
//				for (Map.Entry<String, String> entry : conditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//				}
//			} else {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
////			if (routes != null && routes.size() > 0) {
////				rq.routing(routes.toArray(new String[routes.size()]));
////			}
//			rq.indices(indices.toArray(new String[indices.size()])).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			// 执行查询
//			//es entity content is too long 问题处理
//			  Builder builder = RequestOptions.DEFAULT.toBuilder();
//			  builder.setHttpAsyncResponseConsumerFactory(new HeapBufferedResponseConsumerFactory(1024*1024*1024));
//			  SearchResponse response = client.search(rq,builder.build());
//			SearchHits hits = response.getHits();
//			for (SearchHit hit : hits) {
//				esRecords.add(hit.getSourceAsString());
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//		return listBigData2;
//	}
//
//	/**
//	 * 分页查询
//	 *
//	 * @param database
//	 * @param tablename
//	 * @param conditions
//	 * @param currentPage
//	 * @param pageSize
//	 * @param clazz
//	 * @return
//	 */
//	public <T> ResultTotal<T> getPagesByConditions(String database, String tablename, Map<String, String> conditions,
//			Integer currentPage, Integer pageSize, Class<T> clazz) {
//
//		T bb = null;
//		JsonUtil jj = new JsonUtil();
//		ResultTotal<T> dataPage = new ResultTotal<T>();
//		try {
//			validationEsQuery(database, tablename);
//			// 返回的结果
//			List<T> listBigData2 = new ArrayList<T>();
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			indexName = database.toLowerCase();
//			indexType = tablename.toLowerCase();
//			if (!ESOperator.indicesExists(client, indexName)) {
//				// 缺少参数代码
//				logger.info("缺少参数代码");
//				return null;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加分页条件
//			sourceBuilder.from((currentPage - 1) * pageSize).size(pageSize);
//
//			// 添加查询条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (conditions != null) {
//				for (Map.Entry<String, String> entry : conditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//				}
//			} else {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//			// 添加多级排序
////            if (dataPage.getSort() != null) {
////                sourceBuilder.sort(dataPage.getSort(),SortOrder.valueOf(dataPage.getSort()));
//////                searchRequestBuilder.addSort(dataPage.getSort(), SortOrder.valueOf(dataPage.getSort()));
////            }
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
//			rq.indices(indexName).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			// 执行查询
//			SearchResponse response = client.search(rq);
//			for (SearchHit hit : response.getHits()) {
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//			long totalHits = response.getHits().getTotalHits();
//			dataPage.setPageNo(currentPage);
//			dataPage.setPageSize(pageSize);
//			dataPage.setTotal((int) totalHits);
////            dataPage.setSort(dataPage.getSort());
//			dataPage.setDataResult(listBigData2);
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//		return dataPage;
//	}
//
//	/**
//	 * @param database
//	 * @param tablename
//	 * @param rangeKey
//	 * @param rangeMap
//	 * @param conditions
//	 * @param currentPage
//	 * @param pageSize
//	 * @param clazz
//	 * @return 无分页 查询 范围
//	 */
//	public <T> ResultTotal<T> getDataConditions(String database, String tablename, String rangeKey,
//			Map<String, String> rangeMap, Map<String, String> conditions, Class<T> clazz) {
//		ResultTotal<T> dataPage = new ResultTotal<T>();
//
//		T bb = null;
//		JsonUtil jj = new JsonUtil();
//		try {
//			validationEsQuery(database, tablename);
//			// 返回的结果
//			List<T> listBigData2 = new ArrayList<T>();
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			indexName = database.toLowerCase();
//			indexType = tablename.toLowerCase();
//			if (!ESOperator.indicesExists(client, indexName)) {
//				// 缺少参数代码
//				logger.info("缺少参数代码");
//				return null;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加分页条件
//			// sourceBuilder.from((currentPage - 1) * pageSize).size(pageSize);
//			// 添加查询条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (!conditions.isEmpty()) {
//				// 处理日期
////                WeekOrMouth weekOrMouth=new WeekOrMouth();
//				String FisrtDay = rangeMap.get("FisrtDay");
//				String LastDay = rangeMap.get("LastDay");
//				// 添加日期大小范围条件
//				RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//				boolQueryBuilder.filter(rangeQueryBuilder);
//				// 添加 matchPhraseQuery 条件查询
//				for (Map.Entry<String, String> entry : conditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//					// boolQueryBuilder.must(boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(),
//					// entry.getValue()))));
//				}
//			} else {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
////            if (dataPage.getSort() != null) {
////                sourceBuilder.sort(dataPage.getSort(),SortOrder.valueOf(dataPage.getSort()));
//////                searchRequestBuilder.addSort(dataPage.getSort(), SortOrder.valueOf(dataPage.getSort()));
////            }
//			// 执行查询
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
//			rq.indices(indexName).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			SearchResponse response = client.search(rq);
//			for (SearchHit hit : response.getHits()) {
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//			long totalHits = response.getHits().getTotalHits();
//			dataPage.setPageNo(1);
//			dataPage.setPageSize(1);
//			dataPage.setTotal((int) totalHits);
////            dataPage.setSort(dataPage.getSort());
//			dataPage.setDataResult(listBigData2);
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//
//		return dataPage;
//	}
//
//	/**
//	 * 日期范围查询 +分页+条件查询
//	 *
//	 * @param database
//	 * @param tablename
//	 * @param conditions
//	 * @param currentPage
//	 * @param pageSize
//	 * @param clazz
//	 * @return
//	 */
//	public <T> ResultTotal<T> getDateByPagesConditions(String database, String tablename, String rangeKey,
//			Map<String, String> rangeMap, Map<String, String> conditions, Integer currentPage, Integer pageSize,
//			Class<T> clazz) {
//		ResultTotal<T> dataPage = new ResultTotal<T>();
//
//		T bb = null;
//		JsonUtil jj = new JsonUtil();
//		try {
//			validationEsQuery(database, tablename);
//			// 返回的结果
//			List<T> listBigData2 = new ArrayList<T>();
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			indexName = database.toLowerCase();
//			indexType = tablename.toLowerCase();
//			if (!ESOperator.indicesExists(client, indexName)) {
//				// 缺少参数代码
//				logger.info("缺少参数代码");
//				return null;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加分页条件
//			sourceBuilder.from((currentPage - 1) * pageSize).size(pageSize);
//			// 添加查询条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (!conditions.isEmpty()) {
//				// 处理日期
////                WeekOrMouth weekOrMouth=new WeekOrMouth();
//				String FisrtDay = rangeMap.get("FisrtDay");
//				String LastDay = rangeMap.get("LastDay");
//				// 添加日期大小范围条件
//				RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//				boolQueryBuilder.filter(rangeQueryBuilder);
//				// 添加 matchPhraseQuery 条件查询
//				for (Map.Entry<String, String> entry : conditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//					// boolQueryBuilder.must(boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(),
//					// entry.getValue()))));
//				}
//			} else {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
////            if (dataPage.getSort() != null) {
////                sourceBuilder.sort(dataPage.getSort(),SortOrder.valueOf(dataPage.getSort()));
//////                searchRequestBuilder.addSort(dataPage.getSort(), SortOrder.valueOf(dataPage.getSort()));
////            }
//			// 执行查询
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
//			rq.indices(indexName).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			SearchResponse response = client.search(rq);
//			for (SearchHit hit : response.getHits()) {
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//			long totalHits = response.getHits().getTotalHits();
//			dataPage.setPageNo(currentPage);
//			dataPage.setPageSize(pageSize);
//			dataPage.setTotal((int) totalHits);
////            dataPage.setSort(dataPage.getSort());
//			dataPage.setDataResult(listBigData2);
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//
//		return dataPage;
//	}
//
//	/**
//	 * 分页查询
//	 *
//	 * @param <T>
//	 * @param database           索引名
//	 * @param tablename          表名
//	 * @param mustConditions     and关系查询条件
//	 * @param shouldConditions   or关系查询条件
//	 * @param wildcardConditions 模糊查询查询条件
//	 * @param currentPage        起始页
//	 * @param pageSize           每页数量
//	 * @param clazz              返回数据对象
//	 * @return
//	 */
//	public <T> ResultTotal<T> getPagesByMustAndShould(String database, String tablename, List<String> routes,
//			String rangeKey, Map<String, String> mustConditions, Map<String, List<String>> shouldConditions,
//			Map<String, String> wildcardConditions, Integer currentPage, Integer pageSize, Class<T> clazz) {
//		ResultTotal<T> dataPage = new ResultTotal<T>();
//		List<T> listBigData2 = new ArrayList<T>();
//		T bb = null;
//		JsonUtil jj = new JsonUtil();
//		// DataTypeGrid<T> dataPage = new DataTypeGrid<T>();
//		try {
//			validationEsQuery(database, tablename);
//			// 返回的结果
//			List<String> esRecords = new ArrayList<String>();
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			indexName = database.toLowerCase();
//			indexType = tablename.toLowerCase();
//			if (!ESOperator.indicesExists(client, indexName)) {
//				// 缺少参数代码
//				logger.info("缺少参数代码");
//				return null;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加分页条件
//			sourceBuilder.from((currentPage - 1) * pageSize).size(pageSize);
//			// 添加查询条件
//			String FisrtDay = mustConditions.get("startTime");
//			String LastDay = mustConditions.get("endTime");
//			// 添加日期大小范围条件
//			RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//			// 从查询条件去除时间范围
//			mustConditions.remove("startTime");
//			mustConditions.remove("endTime");
//			// and关系条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (StringUtils.isNotEmpty(mustConditions.get("startSettleDt"))
//					&& StringUtils.isNotEmpty(mustConditions.get("endSettleDt"))) {
//				RangeQueryBuilder rangeQueryBuilder1 = QueryBuilders.rangeQuery("settle_dt")
//						.from(mustConditions.get("startSettleDt")).to(mustConditions.get("endSettleDt"));
//				boolQueryBuilder.filter(rangeQueryBuilder).must(rangeQueryBuilder1);
//				mustConditions.remove("startSettleDt");
//				mustConditions.remove("endSettleDt");
//			} else {
//				boolQueryBuilder.filter(rangeQueryBuilder);
//			}
//			if (mustConditions != null && mustConditions.size() > 0) {
//				for (Map.Entry<String, String> entry : mustConditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//				}
//			}
//			// or关系条件
//			if (shouldConditions != null) {
////                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//				Set<String> keySet = shouldConditions.keySet();
//				for (String key : keySet) {
//					List<String> list = shouldConditions.get(key);
//					for (int i = 0; i < list.size(); i++) {
//						boolQueryBuilder.should(QueryBuilders.matchPhraseQuery(key, list.get(i)));
////                        QueryBuilders.boolQuery().filter(QueryBuilders.termQuery(name, value));
//					}
//				}
//			}
//			// 模糊查询
//			if (wildcardConditions != null) {
////                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//				for (Map.Entry<String, String> entry : wildcardConditions.entrySet()) {
//					boolQueryBuilder.must(QueryBuilders.wildcardQuery(entry.getKey(), "*" + entry.getValue() + "*"));
//				}
//			}
//			// 没有查询条件
//			if (shouldConditions == null && (mustConditions == null || mustConditions.size() == 0)
//					&& wildcardConditions == null) {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//			// 添加多级排序
////            if (dataPage.getSort() != null) {
////                sourceBuilder.sort(dataPage.getSort(),SortOrder.valueOf(dataPage.getSort()));
//////                searchRequestBuilder.addSort(dataPage.getSort(), SortOrder.valueOf(dataPage.getSort()));
////            }
//			// 执行查询
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
//			if (routes != null && routes.size() > 0) {
//				rq.routing(routes.toArray(new String[routes.size()]));
//			}
//			rq.indices(indexName).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			SearchResponse response = client.search(rq);
//			for (SearchHit hit : response.getHits()) {
//				esRecords.add(hit.getSourceAsString());
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//			long totalHits = response.getHits().getTotalHits();
//			dataPage.setPageNo(currentPage);
//			dataPage.setPageSize(pageSize);
//			dataPage.setTotal((int) totalHits);
////            dataPage.setSort(dataPage.getSort());
//			dataPage.setDataResult(listBigData2);
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//
//		return dataPage;
//	}
//
//	public <T> ResultTotal<T> getPagesByMustAndShould1(String database, String tablename, List<String> routes,
//			String rangeKey, Map<String, String> mustConditions, Map<String, List<String>> shouldConditions,
//			Map<String, String> wildcardConditions, Integer currentPage, Integer pageSize, Class<T> clazz) {
//		ResultTotal<T> dataPage = new ResultTotal<T>();
//		List<T> listBigData2 = new ArrayList<T>();
//		T bb = null;
//		JsonUtil jj = new JsonUtil();
//		// DataTypeGrid<T> dataPage = new DataTypeGrid<T>();
//		try {
//			validationEsQuery(database, tablename);
//			// 返回的结果
//			List<String> esRecords = new ArrayList<String>();
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			indexName = database.toLowerCase();
//			indexType = tablename.toLowerCase();
//			if (!ESOperator.indicesExists(client, indexName)) {
//				// 缺少参数代码
//				logger.info("缺少参数代码");
//				return null;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加分页条件
//			sourceBuilder.from((currentPage - 1) * pageSize).size(pageSize);
//			// 添加查询条件
//			String FisrtDay = mustConditions.get("startTime");
//			String LastDay = mustConditions.get("endTime");
//			// 添加日期大小范围条件
//			RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//			// 从查询条件去除时间范围
//			mustConditions.remove("startTime");
//			mustConditions.remove("endTime");
//			// and关系条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (StringUtils.isNotEmpty(mustConditions.get("startSettleDt"))
//					&& StringUtils.isNotEmpty(mustConditions.get("endSettleDt"))) {
////    	            	RangeQueryBuilder rangeQueryBuilder1 = QueryBuilders.rangeQuery("settle_dt").from(mustConditions.get("startSettleDt")).to(mustConditions.get("endSettleDt"));
////   	            	 boolQueryBuilder.filter(rangeQueryBuilder);// .must(rangeQueryBuilder1);
////    	            	  mustConditions.remove("startSettleDt");
////    	                  mustConditions.remove("endSettleDt");
//			} else {
//				boolQueryBuilder.filter(rangeQueryBuilder);
//			}
//			String startSettleDt = mustConditions.get("startSettleDt");
//			String endSettleDt = mustConditions.get("endSettleDt");
//			mustConditions.remove("startSettleDt");
//			mustConditions.remove("endSettleDt");
//			// or关系条件
//			if (shouldConditions != null) {
//				Set<String> keySet = shouldConditions.keySet();
//				String[] st = new String[keySet.size()];
//				int n = 0;
//				for (String key : keySet) {
//					st[n] = key;
//					n++;
//				}
//				if (keySet.size() > 1) {
//					List<String> list1 = shouldConditions.get(st[0]);
//					List<String> list2 = shouldConditions.get(st[1]);
//					for (int i = 0; i < list1.size(); i++) {
//						for (int j = 0; j < list2.size(); j++) {
//							BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//							for (Map.Entry<String, String> entry : mustConditions.entrySet()) {
//								queryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//							}
//							boolQueryBuilder.should(queryBuilder.filter(rangeQueryBuilder)
//									.must(QueryBuilders.rangeQuery("settle_dt").from(startSettleDt).to(endSettleDt))
//									.must(QueryBuilders.matchPhraseQuery(st[0], list1.get(i)))
//									.must(QueryBuilders.matchPhraseQuery(st[1], list2.get(j))));
//						}
//					}
//				} else {
//					List<String> list = shouldConditions.get(st[0]);
//					for (int i = 0; i < list.size(); i++) {
//						BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//						for (Map.Entry<String, String> entry : mustConditions.entrySet()) {
//							queryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//						}
//						boolQueryBuilder.should(queryBuilder.filter(rangeQueryBuilder)
//								.must(QueryBuilders.rangeQuery("settle_dt").from(startSettleDt).to(endSettleDt))
//								.must(QueryBuilders.matchPhraseQuery(st[0], list.get(i))));
//					}
//				}
//			} else {
//				if (mustConditions != null && mustConditions.size() > 0) {
//					for (Map.Entry<String, String> entry : mustConditions.entrySet()) {
//						boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//					}
//				}
//			}
//			// 模糊查询
//			if (wildcardConditions != null) {
////    	                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//				for (Map.Entry<String, String> entry : wildcardConditions.entrySet()) {
//					boolQueryBuilder.must(QueryBuilders.wildcardQuery(entry.getKey(), "*" + entry.getValue() + "*"));
//				}
//			}
//			// 没有查询条件
//			if (shouldConditions == null && (mustConditions == null || mustConditions.size() == 0)
//					&& wildcardConditions == null) {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//
//			// 执行查询
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
//			if (routes != null && routes.size() > 0) {
//				rq.routing(routes.toArray(new String[routes.size()]));
//			}
//			rq.indices(indexName).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			SearchResponse response = client.search(rq);
//			for (SearchHit hit : response.getHits()) {
//				esRecords.add(hit.getSourceAsString());
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//			long totalHits = response.getHits().getTotalHits();
//			dataPage.setPageNo(currentPage);
//			dataPage.setPageSize(pageSize);
//			dataPage.setTotal((int) totalHits);
////    	            dataPage.setSort(dataPage.getSort());
//			dataPage.setDataResult(listBigData2);
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//
//		return dataPage;
//	}
//	public <T> ResultTotal<T> getPagesByMustAndShould2(List<String> databases, String tablename, List<String> routes,
//			String rangeKey, Map<String, String> mustConditions, Map<String, List<String>> shouldConditions,
//			Map<String, String> wildcardConditions, Integer currentPage, Integer pageSize, Class<T> clazz) {
//		ResultTotal<T> dataPage = new ResultTotal<T>();
//		List<T> listBigData2 = new ArrayList<T>();
//		T bb = null;
//		JsonUtil jj = new JsonUtil();
//		// DataTypeGrid<T> dataPage = new DataTypeGrid<T>();
//		try {
//			// 返回的结果
//			List<String> esRecords = new ArrayList<String>();
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			//索引集合
//			List<String> indices = new ArrayList<String>();
//			for (String index : databases) {
//				validationEsQuery(index, tablename);
//				if (!ESOperator.indicesExists(client, index.toLowerCase())) {
//					// 缺少参数代码
//					log.info("索引："+index + " 不存在");
//					continue;
//				}else {
//					indices.add(index);
//				}
//			}
//			if (indices.isEmpty() || indices.size() == 0) {
//				dataPage.setDataResult(listBigData2);
//				return dataPage;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加分页条件
//			sourceBuilder.from((currentPage - 1) * pageSize).size(pageSize);
//			// 添加查询条件
//			String FisrtDay = mustConditions.get("startTime");
//			String LastDay = mustConditions.get("endTime");
//			// 添加日期大小范围条件
//			RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//			// 从查询条件去除时间范围
//			mustConditions.remove("startTime");
//			mustConditions.remove("endTime");
//			// and关系条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (StringUtils.isNotEmpty(mustConditions.get("startSettleDt"))
//					&& StringUtils.isNotEmpty(mustConditions.get("endSettleDt"))) {
//				RangeQueryBuilder rangeQueryBuilder1 = QueryBuilders.rangeQuery("settle_dt")
//						.from(mustConditions.get("startSettleDt")).to(mustConditions.get("endSettleDt"));
//				boolQueryBuilder.filter(rangeQueryBuilder).must(rangeQueryBuilder1);
//				mustConditions.remove("startSettleDt");
//				mustConditions.remove("endSettleDt");
//			} else {
//				boolQueryBuilder.filter(rangeQueryBuilder);
//			}
//			if (mustConditions != null && mustConditions.size() > 0) {
//				for (Map.Entry<String, String> entry : mustConditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//				}
//			}
//			// or关系条件
//			if (shouldConditions != null) {
//				Set<String> keySet = shouldConditions.keySet();
//				for (String key : keySet) {
//					boolQueryBuilder.must(QueryBuilders.termsQuery(key, shouldConditions.get(key)));
//				}
//			}
//			// 模糊查询
//			if (wildcardConditions != null) {
////                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//				for (Map.Entry<String, String> entry : wildcardConditions.entrySet()) {
//					boolQueryBuilder.must(QueryBuilders.wildcardQuery(entry.getKey(), "*" + entry.getValue() + "*"));
//				}
//			}
//			// 没有查询条件
//			if (shouldConditions == null && (mustConditions == null || mustConditions.size() == 0)
//					&& wildcardConditions == null) {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//			// 执行查询
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
////			if (routes != null && routes.size() > 0) {
////				rq.routing(routes.toArray(new String[routes.size()]));
////			}
//			rq.indices(indices.toArray(new String[indices.size()])).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//
//			 List<org.apache.http.Header> headers = new ArrayList<org.apache.http.Header>();
//			//es entity content is too long 问题处理
//			  Builder builder = RequestOptions.DEFAULT.toBuilder();
//			  builder.setHttpAsyncResponseConsumerFactory(new HeapBufferedResponseConsumerFactory(1024*1024*1024));
//			  SearchResponse response = client.search(rq,builder.build());
//			for (SearchHit hit : response.getHits()) {
//				esRecords.add(hit.getSourceAsString());
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//			long totalHits = response.getHits().getTotalHits();
//			dataPage.setPageNo(currentPage);
//			dataPage.setPageSize(pageSize);
//			dataPage.setTotal((int) totalHits);
////            dataPage.setSort(dataPage.getSort());
//			dataPage.setDataResult(listBigData2);
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//
//		return dataPage;
//	}
//
//	/**
//	 * 无分页查询
//	 *
//	 * @param <T>
//	 * @param database           索引名
//	 * @param tablename          表名
//	 * @param mustConditions     and关系查询条件
//	 * @param shouldConditions   or关系查询条件
//	 * @param wildcardConditions 模糊查询查询条件
//	 * @param currentPage        起始页
//	 * @param pageSize           每页数量
//	 * @param clazz              返回数据对象
//	 * @return
//	 */
//	public <T> List<T> getByMustAndShouldDown(String database, String tablename, String rangeKey,
//			Map<String, String> mustConditions, Map<String, List<String>> shouldConditions,
//			Map<String, String> wildcardConditions, Class<T> clazz) {
//
//		List<T> listBigData2 = new ArrayList<T>();
//		T bb = null;
//		try {
//			validationEsQuery(database, tablename);
//			// 返回的结果
//			List<String> esRecords = new ArrayList<String>();
//			// 获取ESclient
//			client = elasticSearchPoolUtil.getClient();
//			indexName = database.toLowerCase();
//			indexType = tablename.toLowerCase();
//			if (!ESOperator.indicesExists(client, indexName)) {
//				// 缺少参数代码
//				logger.info("缺少参数代码");
//				return null;
//			}
//			// 创建ES查询Request对象
//			sourceBuilder = new SearchSourceBuilder();
//			// 添加查询条件
//			String FisrtDay = mustConditions.get("startTime");
//			String LastDay = mustConditions.get("endTime");
//			// 添加日期大小范围条件
//			RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeKey).from(FisrtDay).to(LastDay);
//			// 从查询条件去除时间范围
//			mustConditions.remove("startTime");
//			mustConditions.remove("endTime");
//			// and关系条件
//			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//			if (StringUtils.isNotEmpty(mustConditions.get("startSettleDt"))
//					&& StringUtils.isNotEmpty(mustConditions.get("endSettleDt"))) {
//				RangeQueryBuilder rangeQueryBuilder1 = QueryBuilders.rangeQuery("settle_dt")
//						.from(mustConditions.get("startSettleDt")).to(mustConditions.get("endSettleDt"));
//				boolQueryBuilder.filter(rangeQueryBuilder).must(rangeQueryBuilder1);
//				mustConditions.remove("startSettleDt");
//				mustConditions.remove("endSettleDt");
//			} else {
//				boolQueryBuilder.filter(rangeQueryBuilder);
//			}
//			if (mustConditions != null) {
//				for (Map.Entry<String, String> entry : mustConditions.entrySet()) {
//					boolQueryBuilder.must((QueryBuilders.matchPhraseQuery(entry.getKey(), entry.getValue())));
//				}
//			}
//			// or关系条件
//			if (shouldConditions != null) {
////                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//				Set<String> keySet = shouldConditions.keySet();
//				for (String key : keySet) {
//					List<String> list = shouldConditions.get(key);
//					for (int i = 0; i < list.size(); i++) {
//						boolQueryBuilder.should(QueryBuilders.matchPhraseQuery(key, list.get(i)));
//					}
//				}
//			}
//			// 模糊查询
//			if (wildcardConditions != null) {
////                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//				for (Map.Entry<String, String> entry : wildcardConditions.entrySet()) {
//					boolQueryBuilder.must(QueryBuilders.wildcardQuery(entry.getKey(), "*" + entry.getValue() + "*"));
//				}
//			}
//			// 没有查询条件
//			if (shouldConditions == null && (mustConditions == null || mustConditions.size() == 0)
//					&& wildcardConditions == null) {
//				boolQueryBuilder.must(QueryBuilders.matchAllQuery());
//			}
//
//			// 执行查询
//			sourceBuilder.query(boolQueryBuilder);
//			// 设置索引名，类型名
//			SearchRequest rq = new SearchRequest();
//			rq.indices(indexName).searchType(SearchType.QUERY_THEN_FETCH);
//			rq.source(sourceBuilder);
//			SearchResponse response = client.search(rq);
//			for (SearchHit hit : response.getHits()) {
//				esRecords.add(hit.getSourceAsString());
//				bb = JsonUtil.parserObject(hit.getSourceAsString(), clazz);
//				listBigData2.add(bb);
//			}
//		} catch (Exception e) {
//			logger.error("query faild", e);
//			throw new RuntimeException("query faild");
//		} finally {
//			elasticSearchPoolUtil.returnClient(client);
//		}
//		return listBigData2;
//	}
//
//}
